"""
API 客户端模块
处理与后端 API 的通信
"""

from typing import Any, Dict

import requests
import streamlit as st


# 独立的缓存函数，不属于任何类
@st.cache_data(ttl=300)
def get_cached_health_status(base_url: str) -> Dict[str, Any]:
    """
    获取服务健康状态（缓存版本）

    Args:
        base_url: API 服务的基础 URL

    Returns:
        Dict: 健康状态信息
    """
    try:
        response = requests.get(f"{base_url}/health", timeout=5)
        return response.json()
    except Exception as e:
        return {"code": 500, "message": str(e), "data": {"status": "DOWN"}}


class APIClient:
    """API 客户端类，处理与后端 API 的通信"""

    def __init__(self, base_url: str = "http://localhost:5555"):
        """
        初始化 API 客户端

        Args:
            base_url: API 服务的基础 URL
        """
        self.base_url = base_url

    def get_health_status(self) -> Dict[str, Any]:
        """
        获取服务健康状态

        Returns:
            Dict: 健康状态信息
        """
        # 调用独立的缓存函数
        return get_cached_health_status(self.base_url)

    def extract_face_features(
        self, image_base64: str, params: Dict[str, Any]
    ) -> Dict[str, Any]:
        """
        提取人脸特征

        Args:
            image_base64: Base64 编码的图像数据
            params: 请求参数

        Returns:
            Dict: API 响应结果
        """
        try:
            url = f"{self.base_url}/extract_face_features"
            data = {"image_base64": image_base64, **params}
            response = requests.post(url, json=data, timeout=30)
            return response.json()
        except Exception as e:
            return {"code": 500, "message": str(e), "data": None}

    def match_two_faces(
        self, image1_base64, image2_base64, metric="cosine", threshold=0.6
    ):
        """
        匹配两张图片中的人脸

        Args:
            image1_base64: 第一张图片的base64编码
            image2_base64: 第二张图片的base64编码
            metric: 相似度度量方法
            threshold: 相似度阈值

        Returns:
            API响应结果
        """
        url = f"{self.base_url}/match_two_faces"
        payload = {
            "image1_base64": image1_base64,
            "image2_base64": image2_base64,
            "metric": metric,
            "threshold": threshold,
        }
        
        return self._make_request("POST", url, payload)

    def match_face_to_faces(
        self, image1_base64, image2_base64, metric="cosine", threshold=0.6
    ):
        """
        匹配一张图片和一张多人脸图片

        Args:
            image1_base64: 源图片的base64编码
            image2_base64: 目标多人脸图片的base64编码
            metric: 相似度度量方法
            threshold: 相似度阈值

        Returns:
            API响应结果
        """
        url = f"{self.base_url}/match_face_to_faces"
        payload = {
            "image1_base64": image1_base64,
            "image2_base64": image2_base64,
            "metric": metric,
            "threshold": threshold,
        }
        
        return self._make_request("POST", url, payload)

    def _make_request(self, method, url, data=None):
        """
        发送HTTP请求

        Args:
            method: HTTP方法（GET, POST等）
            url: 请求URL
            data: 请求数据

        Returns:
            API响应结果
        """
        try:
            if method.upper() == "GET":
                response = requests.get(url, params=data, timeout=30)
            elif method.upper() == "POST":
                response = requests.post(url, json=data, timeout=30)
            else:
                raise ValueError(f"不支持的HTTP方法: {method}")

            return response.json()
        except Exception as e:
            return {"code": 500, "message": str(e), "data": None}


